-- $LastChangedDate: 2007-06-01 02:52:33 +0200 (Fri, 01 Jun 2007) $
-- $LastChangedRevision: 149 $
-- $LastChangedBy: vicente $

-- packages del gimnasio
WITH Tiposprotegidos.Log;
USE Tiposprotegidos.Log;

SEPARATE (Tareas.Gmedicos)

   -- Buscar un medico libre en la lista MList
PROCEDURE Get_Idle_Medico (
      Mlist        : IN     Listas.Gmedicos_Lists.List_Type;
      M            :    OUT Medicoptr;
      Free_Medicos : IN OUT Natural;
      Cl_Id        : IN     Task_Id) IS
   Encontrado : Boolean                             := False;
   It         : Listas.Gmedicos_Lists.List_Iterator;
   Nodo       : Nodomedico;
BEGIN
   It := Listas.Gmedicos_Lists.First(Mlist);
   WHILE It /= Listas.Gmedicos_Lists.Last(Mlist) AND NOT
         Encontrado LOOP
      Nodo := Listas.Gmedicos_Lists.Value(It);
      IF Nodo.Estado = Libre THEN
         Encontrado:= True;
      ELSE
         It := Listas.Gmedicos_Lists.Succ(It);
      END IF;
   END LOOP;

   -- si no encuentra un medico libre devuelve NULL
   IF NOT Encontrado THEN
      M:= NULL;
      Print("get_idle_medico: No hay medicos libres");
   END IF;

   IF Encontrado THEN
      M:= Nodo.Mptr;
      Print("get_idle_medico: asignado al cliente cuidado por el monitor " & Image(Cl_Id) & " el medico con ID "
         & Image(Nodo.Id));
      IF Nodo.Estado /= Ocupado THEN
         Nodo.Estado := Ocupado;
         Listas.Gmedicos_Lists.Update(It, Nodo);
         Free_Medicos := Free_Medicos - 1;
         -- log
         Log_Dec(Medico_Libre);
      END IF;
   END IF;
END Get_Idle_Medico;
